﻿using API.Models.Repository;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace API.Controllers
{
    public class DocumentController : Controller
    {
        private API.Models.SEC_SESSIONS GetSession(string api_key)
        {
            var sessionRepository = new SEC_SESSIONS_Repository();
            var ip = Request.RequestContext.HttpContext.Request.UserHostAddress;
            return sessionRepository.LogIn(ip, api_key);
        }


        public ActionResult CheckConstraints(string api_key)
        {
            var session = GetSession(api_key);
            if (session == null)
                throw new Exception("Сессия не найдена");

            var repository = new IncomingInvoices_Repository();
            repository.SetSession(session);
            var data = repository.Find().ToList();


            var userCompanyRepository = new SEC_USER_COMPANIES_Repository();
            var users = userCompanyRepository.Find(r =>
                r.COMPANY_GUID == session.COMPANY_GUID && r.IS_ALLOWED).Select(r => r.USER);

            data.Where(r => r.LINES.Any(n => !n.ITEM_GUID.HasValue)).ToList().ForEach(r =>
            {
                var message = @"<h3>Уважаемый пользователь</h3><br/><a href='" + HttpContext.Request.Url.Host + "/document/incoming/#!/invoice/" + r.GUID_RECORD.ToString() + "'>Накладная №" + r.DOC_NUMBER + " от " + r.DOC_DATE.ToShortDateString() + "</a> не может быть загружена.<br/>Требуется ввести соответствие для товаров<br/>";

                users.ToList().ForEach(u =>
                {
                    if (!String.IsNullOrEmpty(u.EMAIL))
                        new Core.EdexMail().Send(u.EMAIL, "Указать соответствие для товара", message);
                });
            });
            
            /*
            data.Where(r => !r.LOCATION_GUID.HasValue).ToList().ForEach(r =>
            {
                var message = @"
Уважаемый пользователь!

Накладная №{0} от {1} не может быть загружена. Требуется ввести соответствие для склада.";

                message = String.Format(message, r.DOC_NUMBER, r.DOC_DATE.ToShortDateString());

                users.ToList().ForEach(u =>
                {
                    if (!String.IsNullOrEmpty(u.EMAIL))
                        new Core.EdexMail().Send(u.EMAIL, "EDEX. Указать соответствие для локации", message);
                });
            });
            */

            return Content("OK");
        }


        public ActionResult SetIncomingNumber(string api_key, Guid id, string incomingNumber)
        {
            var session = GetSession(api_key);
            if (session == null)
                throw new Exception("Сессия не найдена");

            var repository = new IncomingInvoices_Repository();
            repository.SetSession(session);
            repository.SetIncomingNumber(id, incomingNumber);

            return Content("OK");
        }

    }
}
